package com.softtown.modules.sys.service.impl;

import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.softtown.common.exception.ErrorCode;
import com.softtown.common.service.impl.BaseServiceImpl;
import com.softtown.common.utils.ConvertUtils;
import com.softtown.common.utils.Result;
import com.softtown.modules.oss.cloud.OSSFactory;
import com.softtown.modules.sys.dao.CompSysRoleUserDao;
import com.softtown.modules.sys.dto.CompRoleUserAddDTO;
import com.softtown.modules.sys.dto.CompSysRoleUserAllocatePageDTO;
import com.softtown.modules.sys.dto.CompSysRoleUserDeleteDTO;
import com.softtown.modules.sys.entity.CompSysRoleUserEntity;
import com.softtown.modules.sys.entity.CompSysUserEmplEntity;
import com.softtown.modules.sys.service.CompSysRoleUserService;
import com.softtown.modules.sys.vo.RoleUserInfosVO;
import java.util.Objects;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * 公司角色用户
 *
 * @author Dingyayong
 * @version v1.0
 * @create 2019-05-20 17:41
 **/
@Service
public class CompSysRoleUserServiceImpl extends BaseServiceImpl<CompSysRoleUserDao, CompSysRoleUserEntity> implements CompSysRoleUserService {

    @Override
    public List<CompSysRoleUserEntity> getByRoleId(Long roleId) {
        return baseDao.getByRoleId(roleId);
    }

    @Override
    public List<Long> getRoleIdList(Long compId, Long userId) {
        return baseDao.getRoleIdList(compId, userId);
    }

    @Override
    public CompSysRoleUserEntity getRoleUserEntity(Long compId, Long roleId, Long userId) {
        return baseDao.getRoleUserEntity(compId, roleId, userId);
    }

    @Override
    @Transactional(rollbackFor = Exception.class)
    public void updateRoleUserInfo(CompSysRoleUserEntity compSysRoleUserEntity) {
        baseDao.updateRoleUserInfo(compSysRoleUserEntity);
    }

    @Override
    public PageInfo<RoleUserInfosVO> getCompUsersByRole(CompSysRoleUserAllocatePageDTO compSysRoleUserAllocatePageDTO) {
        Integer pageSize = compSysRoleUserAllocatePageDTO.getPageSize();
        Integer page = compSysRoleUserAllocatePageDTO.getPage();
        Page pager = PageHelper.startPage(page, pageSize);
        List<CompSysRoleUserEntity> compSysRoleUserEntityList = baseDao.getCompSysRoleUserListByCompIdAndRoleId(compSysRoleUserAllocatePageDTO.getRoleId(), compSysRoleUserAllocatePageDTO.getCompId());
        List<Long> userIds = new ArrayList<>();
        for (CompSysRoleUserEntity compSysRoleUserEntity : compSysRoleUserEntityList) {
            userIds.add(compSysRoleUserEntity.getUserId());
        }
        List<CompSysUserEmplEntity> compSysUserEmplEntities = baseDao.getRoleUserListByIds(userIds, compSysRoleUserAllocatePageDTO.getParam(), compSysRoleUserAllocatePageDTO.getCompId(), compSysRoleUserAllocatePageDTO.getRoleId());
        for (CompSysUserEmplEntity compSysUserEmplEntity : compSysUserEmplEntities) {
            if (compSysUserEmplEntity.getHeadUrl() != null) {
                compSysUserEmplEntity.setHeadUrl(Objects.requireNonNull(OSSFactory.build()).getHeadUrl(compSysUserEmplEntity.getHeadUrl()));
            }
        }
        List<RoleUserInfosVO> roleUserInfosVOList = ConvertUtils.sourceToTarget(compSysUserEmplEntities, RoleUserInfosVO.class);
        return ConvertUtils.pageInfoToTarget(pager, roleUserInfosVOList);
    }

    @Override
    public Result checkRoleUserExist(CompRoleUserAddDTO compRoleUserAddDTO) {
        List<CompSysRoleUserEntity> compSysRoleUserEntityList = baseDao.getCompSysRoleUserListByCompIdAndRoleId(compRoleUserAddDTO.getRoleId(), compRoleUserAddDTO.getCompId());
        for (CompSysUserEmplEntity compSysUserEmplEntity : compRoleUserAddDTO.getUsers()) {
            for (CompSysRoleUserEntity compSysRoleUserEntity : compSysRoleUserEntityList) {
                if (compSysRoleUserEntity.getUserId().equals(compSysUserEmplEntity.getUserId())) {
                    Result result = new Result<>();
                    return result.error(compSysUserEmplEntity.getNickname() + result.error(ErrorCode.ROLE_ALREADY_ERROR).getMsg());
                }
            }
        }
        return null;
    }

    @Override
    @Transactional(rollbackFor = Exception.class)
    public void insertRoleUser(CompRoleUserAddDTO compRoleUserAddDTO) {
        List<CompSysRoleUserEntity> insertList = new ArrayList<>();
        for (CompSysUserEmplEntity compUserEmplEntity : compRoleUserAddDTO.getUsers()) {
            CompSysRoleUserEntity compSysRoleUserEntity = new CompSysRoleUserEntity();
            compSysRoleUserEntity.setCompId(compRoleUserAddDTO.getCompId());
            compSysRoleUserEntity.setRoleId(compRoleUserAddDTO.getRoleId());
            compSysRoleUserEntity.setUpdater(compRoleUserAddDTO.getUserId());
            compSysRoleUserEntity.setCreator(compUserEmplEntity.getUserId());
            compSysRoleUserEntity.setUserId(compUserEmplEntity.getUserId());
            compSysRoleUserEntity.setUpdateTimestamp(String.valueOf(System.currentTimeMillis()));
            compSysRoleUserEntity.setUpdateDate(new Date());
            compSysRoleUserEntity.setCreateDate(new Date());
            insertList.add(compSysRoleUserEntity);
        }
        insertBatch(insertList);
    }

    @Override
    @Transactional(rollbackFor = Exception.class)
    public Result deleteCompRoleUser(CompSysRoleUserDeleteDTO compSysRoleUserDeleteDTO) {
        Result result = new Result<>();
        CompSysRoleUserEntity compSysRoleUserEntity = ConvertUtils.sourceToTarget(compSysRoleUserDeleteDTO, CompSysRoleUserEntity.class);
        CompSysRoleUserEntity deleteEntity = new CompSysRoleUserEntity();
        synchronized (this) {
            CompSysRoleUserEntity checkEntity = baseDao.selectCompRoleUserByRoleIdCompIdUserId(compSysRoleUserDeleteDTO.getRoleId(), compSysRoleUserDeleteDTO.getCompId(), compSysRoleUserDeleteDTO.getUserId());
            if (!checkEntity.getUpdateTimestamp().equals(compSysRoleUserEntity.getUpdateTimestamp())) {
                return result.error(ErrorCode.DELETE_FAILED_ERROR);
            }
            deleteEntity.setIsDeleted(null);
            deleteEntity.setUpdateTimestamp(String.valueOf(System.currentTimeMillis()));
            deleteEntity.setId(compSysRoleUserEntity.getId());
            baseDao.deleteRoleUserInfo(deleteEntity);
        }
        return result;
    }

    @Override
    public List<Long> getRoleId(Long compId, Long userId) {
        List<CompSysRoleUserEntity> compSysRoleUserEntityList = baseDao.getRoleInfo(compId, userId);
        List<Long> roleIds = new ArrayList<>();
        for (CompSysRoleUserEntity compSysRoleUserEntity : compSysRoleUserEntityList) {
            roleIds.add(compSysRoleUserEntity.getRoleId());
        }
        return roleIds;
    }
}

